/*******************************************************************************
* Copyright (c) 2009 Sebastian Benz.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sebastian Benz - initial API and implementation
******************************************************************************/
/**
* <copyright>
*
* Copyright (c) 2002-2006 Sebastian Benz and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sebastian Benz - Initial API and implementation
*
* </copyright>
*
*
*/
package org.xrepl.xscript.util;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.Date;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
public final class EcoreUtil3 {
private EcoreUtil3() {
// should not be instantiated
}
public static boolean isInstantiatable(EClass eClass) {
return !eClass.isAbstract() && !eClass.isInterface();
}
public static boolean isSubClass(EClass eClass, EClass potentialSubclass) {
if (potentialSubclass == null) {
return false;
}
if (eClass == potentialSubclass) {
return true;
}
for (EClass superType : potentialSubclass.getEAllSuperTypes()) {
if (eClass == superType) {
return true;
}
}
return false;
}
public static boolean isEReference(EStructuralFeature eFeature) {
return eFeature instanceof EReference
&& !((EReference) eFeature).isContainment();
}
public static boolean isEContainment(EStructuralFeature eStructuralFeature) {
if (eStructuralFeature instanceof EReference) {
EReference eReference = (EReference) eStructuralFeature;
return eReference.isContainment();
}
return false;
}
public static boolean isEAttribute(EStructuralFeature eFeature) {
if (eFeature == null) {
return false;
}
return eFeature instanceof EAttribute;
}
public static boolean isStringAttribute(EStructuralFeature eFeature) {
if (eFeature.getEType() instanceof EDataType) {
EDataType dataType = (EDataType) eFeature.getEType();
return dataType.getInstanceClass() == String.class;
}
return false;
}
public static boolean isIntegerAttribute(EStructuralFeature eFeature) {
if (eFeature.getEType() instanceof EDataType) {
EDataType dataType = (EDataType) eFeature.getEType();
Class<?> instanceClass = dataType.getInstanceClass();
return instanceClass == int.class || instanceClass == short.class
|| instanceClass == long.class
|| instanceClass == BigInteger.class;
}
return false;
}
public static boolean isBooleanAttribute(EStructuralFeature eFeature) {
if (eFeature.getEType() instanceof EDataType) {
EDataType dataType = (EDataType) eFeature.getEType();
return dataType.getInstanceClass() == boolean.class;
}
return false;
}
public static boolean hasFeature(EClass eClass, EStructuralFeature eFeature) {
return eClass.getEAllStructuralFeatures().contains(eFeature);
}
@SuppressWarnings("unchecked")
public static void setOrAddValue(EObject eObject,
EStructuralFeature eFeature, Object newValue) {
if (eFeature.isMany()) {
EList<Object> eList = (EList<Object>) eObject.eGet(eFeature);
eList.add(newValue);
} else {
if (newValue instanceof EObject) {
EObject newEValue = (EObject) newValue;
if (newEValue.eIsProxy()) {
org.eclipse.emf.ecore.util.EcoreUtil.resolve(newEValue,
eObject);
}
}
eObject.eSet(eFeature, newValue);
}
}
public static boolean isDoubleAttribute(EStructuralFeature eFeature) {
if (eFeature.getEType() instanceof EDataType) {
EDataType dataType = (EDataType) eFeature.getEType();
Class<?> instanceClass = dataType.getInstanceClass();
return instanceClass == double.class
|| instanceClass == BigDecimal.class;
}
return false;
}
public static Iterable<EAttribute> getAllAttributes(EClass eClass,
final Class<String> type) {
return Iterables.filter(eClass.getEAllAttributes(),
new Predicate<EAttribute>() {
public boolean apply(EAttribute input) {
if (input.getEType() instanceof EDataType) {
EDataType dataType = (EDataType) input.getEType();
return dataType.getInstanceClass() == type;
}
return false;
}
});
}
public static boolean isDateAttribute(EStructuralFeature eFeature) {
if (eFeature.getEType() instanceof EDataType) {
EDataType dataTyp = (EDataType) eFeature.getEType();
return dataTyp.getInstanceClass() == Date.class;
}
return false;
}
public static boolean isEnum(EClassifier eType) {
return eType instanceof EEnum;
}
public static Iterable<? extends EObject> getAssignableFeatures(
EClass eClass) {
return Iterables.filter(eClass.getEAllStructuralFeatures(),
new Predicate<EStructuralFeature>() {
public boolean apply(EStructuralFeature input) {
return input.isChangeable();
}
});
}
public static EEnumLiteral getEnumLiteral(EEnum enumType,
final Enumerator enumerator) {
return Iterables.find(enumType.getELiterals(),
new Predicate<EEnumLiteral>() {
public boolean apply(EEnumLiteral input) {
return enumerator.toString().equals(input.getLiteral());
}
});
}
public static boolean isDuplicate(
Collection<EStructuralFeature> existingFeatures,
EStructuralFeature eFeature) {
return !eFeature.isMany() && existingFeatures.contains(eFeature);
}
// public static boolean isDuplicate(EList<Feature> existingFeatures,
// EStructuralFeature featureToCheck) {
// if (featureToCheck.isMany()) {
// return false;
// }
// for (Feature feature : existingFeatures) {
// if (feature.getEFeature() == featureToCheck) {
// return true;
// }
// }
// return false;
// }
}